#ifndef _RAMLOG_H_

#define _RAMLOG_H_

#ifdef __cplusplus
extern "C" {
#endif

#define MAX_LAST_LOG (4)

struct ramlog {
	char name[256];
	char tm[20];
	char *rampath;					///< 日志内存路径
	char *diskpath;					///< 日志磁盘路径
	char *prefix;				///< 日志前缀
	int curid;					///< 当前文件id
	int last_log;					///< MAX_LAST_LOG
	char last_id[MAX_LAST_LOG][32]; ///< 最新的若干文件

	unsigned long s_log;				///< 单个日志大小，以byte为单位，为提高文件多次写入速度，建议大小设置成扇区大小
	unsigned long s_total;				///< 日志总大小，以byte为单位
	unsigned long s_cur;

};

#define _1K (1024)
#define _1M (1024*1024)

#if 0
int rl_dirlimitsize(struct ramlog *val, char *dir);
int rl_init(struct ramlog *val,
            char *rampath, char *diskpath,
            int s_log, int s_total);
int rl_onefile(struct ramlog *val, char *str, int n);
int rl_multifile(struct ramlog *val, char *str, int n);


int rl_snprintf (struct ramlog *val, char *s, size_t maxlen, const char *format, ...);

#endif

/**
 * @brief	初始化日志环境
 * @param[out]	rl 日志描述
 * @param[in]	rampath 日志存储于内存文件系统位置
 * @param[in]	ramsize 将要申请的内存大小（最小4K）
 * @param[in]	disppath 日志存储于磁盘文件系统位置
 * @param[in]	disksize 日志大小
 * @remarks	运行过程中最大消耗内存大小为 ramsize 的两倍，其中之一是应用程序
 * 	自身运行过程当中 malloc 的分配，另一部分是写入内存文件系统后对文件系统
 *	的消耗，消耗量相同
 *	内存文件系统的消耗不是自动的，而是在接收到外部信号SIGUSER1才执行。
 *
 *	程序退出后 malloc 部分被系统自动释放，内存文件系统的文件被 子进程 删除，
 *	数据写入磁盘文件系统
 * @see	rl_clone
 * @see	rl_sync
 */

int rl_init(struct ramlog *rl,
            char *rampath, int ramsize,
            char *diskpath, int disksize);


/**
 * @brief	以共享内存方式创建子进程用于监控调用进程是否退出，
 *	退出则将日志写入磁盘，最后自身的退出，否则继续休眠，休眠粒度为 1S
 * retval	成功返回子进程pid，否则-1，具体原因查看errno
 * @see	rl_clone_parent
 */

int rl_clone();

/**
 * @brief	与rl_clone功能一样，只不过创建调用者变成子进程，监控进程没必要 
 *	1S 休眠，而是等待SIGCHLD信号
 *	（暂时不实现）
 * retval	成功返回子进程pid，否则-1，具体原因查看errno
 * @see	rl_clone
 */
int rl_clone_parent(int (*fn)(void *), void *child_stack,
                 int flags, void *arg, ...);

/**
 * @brief	应用程序主动强制写入磁盘
 * @remarks	不要频繁调用它，会影响系统性能，除非是为了防范突然掉电
 * @see	
 */

void rl_sync();


/**
 * @brief	写入日志内容，写入到全局struct ramlog *dev指向位置（主要接口）
 * @param[in]	format 格式化
 * @param[in]	... 格式化填充参数
 * @retval	写入日志内容长度
 */
int rl_log (const char *format, ...);

/**
 * @brief	写入日志内容，写入到指定struct ramlog *dev位置，通常作为多
 *	模块调试互补干扰而使用
 *	（暂时不实现）
 * @param[in]	rl 指定输出到某路径
 * @param[in]	format 格式化
 * @param[in]	... 格式化填充参数
 * @retval	写入日志内容长度
 */
int rl_flog (struct ramlog *rl, const char *format, ...);


#ifdef __cplusplus
}
#endif

#endif

